#ifndef TOOLSMANAGER_H
#define TOOLSMANAGER_H

#include <wx/event.h>
#include "manager.h"
#include "menuitemsmanager.h"
#include "M_Code_tool.h"

WX_DECLARE_LIST( cbTool, ToolsList );

class wxMenuBar;
class wxMenu;
class wxMenuItem;
class PipedProcess;
class CodeBlocksEvent;

class ToolsManager : public Mgr<ToolsManager>, public wxEvtHandler {
  public:
    friend class Mgr<ToolsManager>;
    friend class Manager;
    void CreateMenu( wxMenuBar* menuBar );
    void ReleaseMenu( wxMenuBar* menuBar );
    void AddTool( const cbTool* tool, bool save = true );
    void InsertTool( int position, const cbTool* tool, bool save = true );
    void RemoveToolByIndex( int index );
    cbTool* GetToolByMenuId( int id );
    cbTool* GetToolByIndex( int index );
    int GetToolsCount() const { return m_Tools.GetCount(); }
    void BuildToolsMenu( wxMenu* menu );
    void OnToolClick( wxCommandEvent& event );
    void OnIdle( wxIdleEvent& event );
    void OnToolStdOutput( CodeBlocksEvent& event );
    void OnToolErrOutput( CodeBlocksEvent& event );
    void OnToolTerminated( CodeBlocksEvent& event );
    void OnConfigure( wxCommandEvent& event );
  private:
    ToolsManager();
    ~ToolsManager();
    void DoRemoveTool( ToolsList::Node* node );
    int Configure();
    bool Execute( const cbTool* tool );
    void LoadTools();
    void SaveTools();
    ToolsList m_Tools;
    MenuItemsManager m_ItemsManager;
    wxMenu* m_Menu;
    PipedProcess* m_pProcess;
    int m_Pid;
    DECLARE_EVENT_TABLE()
};

#endif
